package QianFeng08.CollectionDemo;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 学习链接：https://blog.csdn.net/mu_wind/article/details/109516995
 *          https://blog.csdn.net/IO_Field/article/details/54971761
 * Stream接口:
 * Stream 是用函数式编程方式在集合类上进行复杂操作的工具，其集成了Java 8中的众多新特性之一的聚合操作，
 * 开发者可以更容易地使用Lambda表达式，并且更方便地实现对集合的查找、遍历、过滤以及常见计算等。
 * 不是存储数据结构，数据源可以是一个集合，为了函数式编程二创造惰式执行，数据只能被消费一次
 * Stream是元素的集合，这点让Stream看起来用些类似Iterator;
 * 可以支持顺序和并行的对原Stream进行汇聚的操作;
 *
 * 我们可以把Stream当成一个高级版本的Iterator。原始版本的Iterator，用户只能一个一个的
 * 遍历元素并对其执行某些操作;高级版本的Stream，用户只要给出需要对其包含的元素
 * 执行什么操作，比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母” 等，
 * 具体这些操作如何应用到每个元素上，就给Stream就好 了!
 *
 * 两种类型的操作方法：
 * 1、中间操作（生成一个Stream）
 * 2、结束操作（执行计算操作）
 **/
public class StreamDemo {
    public static void main(String[] args) {
        Stream<String> stringStream = Stream.of("good", "good", "study", "day", "day", "up");
        /*下面方法不能一起执行，否则会报错：流被占用或关闭*/
        //forEach方法  遍历
        //stringStream.forEach((str) -> System.out.println(str));
        //stringStream.forEach(System.out::println);

        //filter  有条件的输出
        //stringStream.filter((s) -> s.length() > 3).forEach(System.out::println);

        //distinct  去除重复元素
        //stringStream.distinct().forEach(System.out::println);

        //map 映射
        //stringStream.map(String::toUpperCase).forEach(System.out::println);

        //flatMap 它把数组流中的每一个值，使用所提供的函数执行一遍，一一对应。得到元素相同的数组流
        //Stream<List<Integer>> stream = Stream.of(Arrays.asList(1, 2, 3), Arrays.asList(4, 5));
        //stream.flatMap(Collection::stream).forEach(System.out::println);

        //reduce
        //Optional<String> optional = stringStream.reduce((s, s2) -> s.length() >= s2.length() ? s : s2);
        //System.out.println(optional.get());

        //collect 根据流生成不同的集合
        List<String> stringList = stringStream.collect(Collectors.toList());//转换成列表形式集合
        stringList.forEach(System.out::println);

        // :: 方法引用   详情至QianFeng06/LambdaDemo/LambdaDemo
        // 引用静态方法    Integer::valueOf
        // 引用对象方法    list::add
        // 引用构造方法    arrayList::new


    }


}
